/*
 * dataLoader.c
 *
 *  Created on: 3 nov. 2012
 *      Author: Rania ToumiGasri
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <string.h>
#include <errno.h>
#include "kmeans.h"
#include "dataLoader.h"
#include "configuration.h"
/* dans le tableau data de la structure Data j'ai ajouté une colonne qui contient
 * les classes de tous les points: avec les coordonnees de chaque point y'a une case supplémantaire
 * contenant sa classe actuelle*/
Data* loadData(char * fileName) {
	// ouvrir le fichier en mode lecture seulement,le fichier doit exister.
	errno = 0;
	printf("nom de fichier à lire '%s'\n", fileName);
	FILE* file = fopen(fileName, "r");
	if (file == NULL && errno != 0) {
		printf("impossible douvrir le fichier '%s' , %s \n", fileName,
				strerror(errno));
		exit(-1);
	}
	errno = 0;
	int nbLignes = 0;
	char ligne[1000];
	char delims[] = " ";
	char *coord = NULL;
	int nbDimension = 0;
	int nbDimensionDerniereLigne = -1;
	while (fgets(ligne, 1000, file) != NULL ) {
		nbLignes++;
		coord = strtok(ligne, delims);
		nbDimension=0;
		while (coord != NULL ) {
			coord = strtok(NULL, delims);
			nbDimension++;
		}
		if (nbDimension == 0) {
			printf("la ligne %d du fichier de données est vide!\n", nbLignes - 1);
			exit(-1);
		}
		if (nbDimensionDerniereLigne != -1
				&& nbDimension != nbDimensionDerniereLigne) {
			printf(
					"la ligne %d du fichier d'entree ne contient pas le même nombre de coordonnées que la précedente.\n",
					nbLignes - 1);
			exit(-1);
		}
		nbDimensionDerniereLigne = nbDimension;
	}
	if (errno != 0) {
		printf(
				"Impossible de calculer le nombre de ligne contenu dans le fichier et de verifier sa structure'%s'\n",
				strerror(errno));
		exit(-1);
	}
	// allocation dynamique de la structure ainsi que sa table.
	Data* donnees = (Data*) malloc(sizeof(Data));
	donnees->dimensionDesDonnees = nbDimension;
	donnees->nombreDesDonnees = nbLignes;
	double** dataTab = (double**) malloc(nbLignes * sizeof(double*));
	//pour chaque point en allou nbdimension+1 * sizeof(double) (En y rajoute le numero de la classe à laquelle il appartient).
	int i;
	for (i = 0; i < nbLignes; i++) {
		dataTab[i] = (double*) malloc((nbLignes + 1) * sizeof(double));
	}
	donnees->data = dataTab;
	rewind(file);
	i = 0;
	int j = 0;
	errno = 0;
	while (fgets(ligne, 1000, file) != NULL ) {
		j = 0;
		coord = strtok(ligne, delims);
		while (coord != NULL ) {
			double cor = atof(coord);
			dataTab[i][j] = cor;
			coord = strtok(NULL, delims);
			j++;
		}
		dataTab[i][nbDimension] = 0;
		i++;
	}
	if (errno != 0) {
		printf("Impossible de charger la liste des données en mémoires'%s'\n",
				strerror(errno));
		exit(-1);
	}
	fclose(file);
	return donnees;
}
